home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / pp / pp-6.0 / Lib / parse / rfc822_parse.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-12-18  |  4.8 KB  |  194 lines

  1. /* rfc822_parse.c: 822 address parsing and normalisation */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Lib/parse/RCS/rfc822_parse.c,v 6.0 1991/12/18 20:23:41 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Lib/parse/RCS/rfc822_parse.c,v 6.0 1991/12/18 20:23:41 jpo Rel $
  9.  *
  10.  * $Log: rfc822_parse.c,v $
  11.  * Revision 6.0  1991/12/18  20:23:41  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16. #include "head.h"
  17. #include "adr.h"
  18.  
  19. extern int ap_lex_percent;
  20. extern char *loc_dom_site;
  21. static int normalise_and_strip_excess_locals();
  22.  
  23. int rfc822_parse(ad)
  24. register ADDR    *ad;
  25. {
  26.     int    old_ap_lex = ap_lex_percent;
  27.     char    buf[BUFSIZ];
  28.     ap_lex_percent =  ad->aparse->percents;
  29.     switch ((int) (ad->aparse->ap_tree =
  30.                ap_s2t ((ad->aparse->r822_str) ?
  31.                    ad->aparse->r822_str : 
  32.                    ad->ad_value))) {
  33.         case 0:
  34.         /* -- could parse it and found it to be duff -- */
  35.         if (ad->aparse->r822_error)
  36.             free(ad->aparse->r822_error);
  37.         (void) sprintf(buf, "Unparseable address '%s'", 
  38.             (ad->aparse->r822_str) ? ad->aparse->r822_str : ad->ad_value);
  39.  
  40.         ad->aparse->r822_error = strdup(buf);
  41.         ap_lex_percent = old_ap_lex;
  42.         return RP_NO;
  43.         
  44.         case NOTOK:
  45.         /* -- couldn't parse it (x400 ?) -- */
  46.         if (ad->aparse->r822_error)
  47.             free(ad->aparse->r822_error);
  48.         ad->aparse->r822_error = strdup("822 parse error");
  49.         ap_lex_percent = old_ap_lex;
  50.         return RP_PARSE;
  51.         
  52.         default:
  53.         ap_lex_percent = old_ap_lex;
  54.         break;
  55.     }
  56.  
  57.     /* -- split into parts -- */
  58.  
  59.     (void) ap_t2p(ad->aparse->ap_tree,
  60.               &ad->aparse->ap_group,
  61.               &ad->aparse->ap_name,
  62.               &ad->aparse->ap_local,
  63.               &ad->aparse->ap_domain,
  64.               &ad->aparse->ap_route);
  65.  
  66.     if (rp_isbad(normalise_and_strip_excess_locals(ad)))
  67.         return RP_PARSE;
  68.  
  69.     fillin_822_str(ad);
  70.  
  71.     return RP_OK;
  72. }
  73.  
  74. static AP_ptr    get_next_route (ad, startfrom)
  75. register ADDR    *ad;
  76. AP_ptr        startfrom;
  77. {
  78.     AP_ptr    ret;
  79.     
  80.     if (startfrom == NULLAP)
  81.         return NULLAP;
  82.     
  83.     if (startfrom->ap_obtype == AP_DOMAIN
  84.         || startfrom->ap_obtype == AP_DOMAIN_LITERAL)
  85.         return startfrom;
  86.  
  87.     ret = startfrom;
  88.     for (;;) {
  89.         switch (ret->ap_ptrtype) {
  90.             case AP_PTR_MORE:
  91.             /* -- next is part of this address -- */
  92.             ret = ret -> ap_next;
  93.             if (ret == ad->aparse->ap_group ||
  94.                 ret == ad->aparse->ap_name ||
  95.                 ret == ad->aparse->ap_local ||
  96.                 ret == ad->aparse->ap_domain)
  97.                 return NULLAP;
  98.  
  99.             switch (ret -> ap_obtype) {
  100.                 case AP_DOMAIN_LITERAL:
  101.                 case AP_DOMAIN:
  102.                 return ret;
  103.                 default:
  104.                 break;
  105.             }
  106.             break;
  107.             default:
  108.             return NULLAP;
  109.         }
  110.     }
  111. }
  112.  
  113. static int normalise_and_strip_excess_locals(ad)
  114. register ADDR    *ad;
  115. {
  116.     AP_ptr    rout;
  117.     
  118.     if (ad->aparse->normalised == APARSE_NORM_ALL) {
  119.         /* normalise all domains */
  120.         rout = ad->aparse->ap_route;
  121.         while (rout && 
  122.                (rout = get_next_route(ad, rout)) != NULLAP) {
  123.             (void) rfc822_norm_dmn(rout, ad->aparse->dmnorder);
  124.             rout = rout->ap_next;
  125.         }
  126.         if (ad->aparse->ap_domain)
  127.             (void) rfc822_norm_dmn(ad->aparse->ap_domain, 
  128.                     ad->aparse->dmnorder);
  129.         rout = get_next_route (ad, ad->aparse->ap_route);
  130.     } else {
  131.         /* normalise first domain */
  132.         if ((rout = get_next_route(ad, ad->aparse->ap_route))
  133.             != NULLAP)
  134.             (void) rfc822_norm_dmn(rout,
  135.                     ad->aparse->dmnorder);
  136.         else if (ad->aparse->ap_domain)
  137.             (void) rfc822_norm_dmn(ad->aparse->ap_domain,
  138.                     ad->aparse->dmnorder);
  139.     }
  140.  
  141.     while (rout && rout->ap_islocal == TRUE) {
  142.         /* local so remove from route */
  143.         ad->aparse->ap_route = rout = get_next_route(ad, rout->ap_next);
  144.         if (rout && rout->ap_normalised != TRUE)
  145.             /* normalise ad->aparse->ap_route */
  146.             (void) rfc822_norm_dmn(rout,
  147.                     ad->aparse->dmnorder);
  148.     }
  149.  
  150.     if (rout == NULLAP) {
  151.         /* no route */
  152.         if (ad->aparse->ap_domain == NULLAP) {
  153.             /* -- no domain either so add default -- */
  154.             AP_ptr    ix;
  155.             if (ad->aparse->ap_local == NULLAP) {
  156.                 /* -- no local either so fail */
  157.                 char    tmp[BUFSIZ];
  158.                 if (ad->aparse->r822_error)
  159.                     free(ad->aparse->r822_error);
  160.                 (void) sprintf(tmp, 
  161.                     "No route, domain or local part to '%s'",
  162.                     ad->ad_value);
  163.                 ad->aparse->r822_error = strdup(tmp);
  164.                 return RP_PARSE;
  165.             }
  166.             for (ix = ad->aparse->ap_local;
  167.                  ix -> ap_next != NULLAP;
  168.                  ix = ix -> ap_next)
  169.                 continue;
  170.             if (loc_dom_site == NULLCP
  171.                 || *loc_dom_site == '\0') {
  172.                 char    tmp[BUFSIZ];
  173.                 if (ad->aparse->r822_error)
  174.                     free(ad->aparse->r822_error);
  175.                 (void) sprintf(tmp, 
  176.                     "loc_dom_site is invalid");
  177.                 ad->aparse->r822_error = strdup(tmp);
  178.                 return RP_PARSE;
  179.             } 
  180.             (void) ap_append (ix, AP_DOMAIN, loc_dom_site);
  181.             ad->aparse->ap_domain = ix->ap_next;
  182.             (void) rfc822_norm_dmn(ad->aparse->ap_domain,
  183.                     ad->aparse->dmnorder);
  184.  
  185.         } else if (ad->aparse->ap_domain->ap_normalised != TRUE)
  186.             /* normalise ad->aparse->ap_domain */
  187.             (void) rfc822_norm_dmn(ad->aparse->ap_domain,
  188.                     ad->aparse->dmnorder);
  189.     }
  190.     return RP_OK;
  191. }        
  192.         
  193.  
  194.